home *** CD-ROM | disk | FTP | other *** search
- /*
- * C-Teil des Startup-Codes gibt folgende globalen Links:
- *
- * ULONG __oslibversion;
- * Ist diese Variable vorhanden dann legt sie die Versionsnummer
- * der automatisch geöffneten Libraries fest.
- * Default: ULONG __oslibversion=36l;
- *
- * extern int _main(char *commandline);
- * Ein Low-Level-main mit der dem Kommando folgenden Kommandozeile
- * als Argument ('\n'-terminiert). Es dürfen _keine_ Funktionen, die
- * Speicher von der ANSI-C-Library erfordern, benutzt werden.
- * (Auch nicht fopen()).
- *
- * extern void _exit(int returncode);
- * Low-Level-exit, das nur die Libraries aufräumt.
- *
- * int _autoinit(void);
- * Ist diese Funktion vorhanden, dann wird sie bei geöffneten Libraries
- * vor _main aufgerufen um globale Einstellungen vornehmen zu können.
- * Default: int _autoinit(void){ return(0); }
- *
- * void _autoexit(void);
- * Ist diese Funktion vorhanden, dann wird sie bei noch geöffneten
- * Libraries nach _exit aufgerufen um wieder aufräumen zu können.
- * Default: void _autoexit(void){ }
- *
- * extern struct WBStartup *_WBenchMsg;
- * Die Workbench-Startup-Message oder NULL bei Start von der Shell.
- *
- * extern void geta4(void);
- * Nur für short-data-model: setzt den global-data segment pointer a4.
- */
-
- #include <stdlib.h>
- #include <exec/execbase.h>
- #include <dos/dosextens.h>
- #include <workbench/startup.h>
- #ifdef __GNUC__
- #include <inline/exec.h>
- #endif
- #ifndef __GNUC__
- #include <clib/exec_protos.h>
- #endif
-
- struct ExecBase *SysBase=NULL;
- struct WBStartup *_WBenchMsg=NULL;
- static int autoinitdone=0;
-
- extern void *__librarybases;
- extern void *__mallocbase;
- extern ULONG __oslibversion;
- extern int _main(char *commandline);
- extern void __aexit(int retval);
-
- static void closelibs(void)
- {
- struct Library **libptr=(struct Library **)&__librarybases+1;
- while(libptr!=(struct Library **)&__mallocbase)
- {
- if(*libptr!=NULL)
- CloseLibrary(*libptr);
- libptr+=2;
- }
- }
-
- static void openlibs(void)
- {
- ULONG version=__oslibversion;
- struct Library **libptr=(struct Library **)&__librarybases+1;
- while(libptr!=(struct Library **)&__mallocbase)
- {
- if((*libptr=OpenLibrary(*(char **)(libptr+1),version))==NULL)
- _exit(RETURN_FAIL);
- libptr+=2;
- }
- }
-
- void __amain(char *commandline)
- {
- int retval;
- struct Process *thistask;
- struct MsgPort *thisport;
- SysBase=*(struct ExecBase **)4l; /* Open exec.library */
- thistask=(struct Process *)FindTask(NULL);
- if (!thistask->pr_CLI)
- {
- thisport=&thistask->pr_MsgPort; /* Start von der Workbench */
- WaitPort(thisport);
- _WBenchMsg=(struct WBStartup *)GetMsg(thisport);
- }
- openlibs();
- if (retval=_autoinit())
- _exit(retval);
- autoinitdone=1;
- _exit(_main(commandline));
- }
-
- void _exit(int returncode)
- {
- if (autoinitdone)
- _autoexit();
- closelibs();
- if (_WBenchMsg)
- {
- Forbid();
- ReplyMsg((struct Message *)_WBenchMsg);
- }
- __aexit(returncode);
- }
-